#include "BlockQueue.hpp"
#include <time.h>
#include "Task.hpp"

using namespace BlockQueueModule;
using namespace TaskModule;

void* Productor(void* args)
{
    BlockQueue<Task>* bq = static_cast< BlockQueue<Task>*>(args);
    while (1)
    {
        // sleep(2);
        // 1.获取数据
        int a = rand() % 10 + 1;
        int b = rand() % 20 + 1;
        Task t(a, b);

        // 2.生产数据
        bq->Equeue(t);
        printf("生产了一个任务: %d+%d=?\n", t.X(), t.Y());
    }
}

void* Consumer(void* args)
{
    BlockQueue<Task>* bq = static_cast< BlockQueue<Task>*>(args);
    while (1)
    {
        //sleep(1);
        // 1.获取数据
        Task t;
        bq->Pop(&t);

        // 2.处理数据
        t.Excute();
        printf("处理了一个任务: %d+%d=%d\n", t.X(), t.Y(), t.Result());
    }
}

int main()
{
    srand(time(nullptr)^ getpid());
    BlockQueue<Task>* bq = new  BlockQueue<Task>();
    pthread_t p1, p2, p3, c1, c2;
    pthread_create(&p1, nullptr, Productor, bq);
    // pthread_create(&p2, nullptr, Productor, bq);
    // pthread_create(&p3, nullptr, Productor, bq);
    pthread_create(&c1, nullptr, Consumer, bq);
    // pthread_create(&c2, nullptr, Consumer, bq);

    pthread_join(p1, nullptr);
    // pthread_join(p2, nullptr);
    // pthread_join(p3, nullptr);
    pthread_join(c1, nullptr);
    // pthread_join(c2, nullptr);
    delete bq;
    return 0;
}